﻿Imports System.Data
Imports MyGeneration.dOOdads
Imports ClassSigeco.ClassSigeco

Public Class controller_ventas

    Private _MessageError As Exception = Nothing
    Public Property MessageError() As Exception
        Get
            Return _MessageError
        End Get
        Set(ByVal value As Exception)
            _MessageError = value
        End Set
    End Property

    'Dim compras As New ControllerSigeco.controller_compras

#Region "Clientes"

    Public Function Insert_Clientes(ByVal conn As String, ByVal cliente As String, ByVal direccion As String, ByVal telefono1 As String, ByVal telefono2 As String, _
                                    ByVal ruc As String, ByVal email As String, ByVal codUsuario As Integer, ByVal categoriaPrecio As String) As Integer

        Dim tx As TransactionMgr
        tx = TransactionMgr.ThreadTransactionMgr()

        Try
            tx.BeginTransaction()

            Dim pro As New ClassSigeco.ClassSigeco.si_cliente(conn)

            pro.AddNew()
            pro.Cliente = cliente
            pro.Direccion = direccion
            pro.Telefono1 = telefono1
            pro.Telefono2 = telefono2
            pro.Email = email
            pro.Ruc = ruc
            pro.Habilitado = True
            pro.ActualizadoPor = codUsuario
            pro.ActualizadoFecha = DateTime.Now
            pro.CategoriaPrecio = categoriaPrecio
            pro.Save()

            tx.CommitTransaction()

            Return pro.IdCliente

        Catch ex As Exception
            tx.RollbackTransaction()
            MessageError = ex
            Return 0
        End Try

    End Function

    Public Function Update_Clientes(ByVal conn As String, ByVal idCliente As Integer, ByVal cliente As String, ByVal direccion As String, ByVal telefono1 As String, ByVal telefono2 As String, _
                                    ByVal ruc As String, ByVal email As String, ByVal codUsuario As Integer, ByVal habilitado As Boolean, ByVal categoriaPrecio As String) As Boolean

        Dim tx As TransactionMgr
        tx = TransactionMgr.ThreadTransactionMgr()

        Try
            tx.BeginTransaction()

            Dim pro As New ClassSigeco.ClassSigeco.si_cliente(conn)
            pro.Where.IdCliente.Value = idCliente

            If pro.Query.Load Then

                pro.Cliente = cliente
                pro.Direccion = direccion
                pro.Telefono1 = telefono1
                pro.Telefono2 = telefono2
                pro.Email = email
                pro.Ruc = ruc
                pro.Habilitado = habilitado
                pro.ActualizadoPor = codUsuario
                pro.ActualizadoFecha = DateTime.Now
                pro.CategoriaPrecio = categoriaPrecio
                pro.Save()

            End If

            tx.CommitTransaction()
            Return True

        Catch ex As Exception
            tx.RollbackTransaction()
            MessageError = ex
            Return False
        End Try

    End Function

    Public Function Delete_Clientes(ByVal conn As String, ByVal idCliente As Integer) As Boolean

        Dim tx As TransactionMgr
        tx = TransactionMgr.ThreadTransactionMgr()

        Try
            tx.BeginTransaction()

            Dim pro As New ClassSigeco.ClassSigeco.si_cliente(conn)
            pro.Where.IdCliente.Value = idCliente

            If pro.Query.Load Then

                pro.MarkAsDeleted()
                pro.Save()

            End If

            tx.CommitTransaction()
            Return True

        Catch ex As Exception
            tx.RollbackTransaction()
            MessageError = ex
            Return False
        End Try

    End Function

    Public Function get_Clientes_All(ByVal conn As String, ByVal idCliente As Integer, ByVal cliente As String, _
                                        ByVal ruc As String, ByVal habilitados As Boolean) As DataTable
        Try

            Dim vPro As New ClassSigeco.ClassSigeco.vw_clientes(conn)

            If idCliente > 0 Then
                vPro.Where.IdCliente.Value = idCliente
            End If

            If cliente <> "" Then
                vPro.Where.Cliente.Value = "%" & cliente & "%"
                vPro.Where.Cliente.Operator = WhereParameter.Operand.Like
            End If

            If ruc <> "" Then
                vPro.Where.Ruc.Value = "%" & ruc & "%"
                vPro.Where.Ruc.Operator = WhereParameter.Operand.Like
            End If

            If habilitados Then
                vPro.Where.Habilitado.Value = habilitados
            End If

            vPro.Query.AddOrderBy("Cliente", WhereParameter.Dir.ASC)

            If vPro.Query.Load Then
                If vPro.DefaultView.Table.Rows.Count > 0 Then
                    Return vPro.DefaultView.Table
                Else
                    Return Nothing
                End If

            Else
                Return Nothing

            End If

        Catch ex As Exception
            MessageError = ex
            Return Nothing
        End Try

    End Function

    Public Function get_Clientes_Ranking(ByVal conn As String) As DataTable
        Try

            Dim vPro As New ClassSigeco.ClassSigeco.vw_ventas_cliente_ranking(conn)

            vPro.Where.Total_facturado.Value = 0
            vPro.Where.Total_facturado.Operator = WhereParameter.Operand.GreaterThan

            vPro.Query.AddOrderBy("total_facturado", WhereParameter.Dir.DESC)

            If vPro.Query.Load Then
                If vPro.DefaultView.Table.Rows.Count > 0 Then
                    Return vPro.DefaultView.Table
                Else
                    Return Nothing
                End If

            Else
                Return Nothing

            End If

        Catch ex As Exception
            MessageError = ex
            Return Nothing
        End Try

    End Function

    Public Function get_Clientes_EstadoCuenta(ByVal conn As String, ByVal idCliente As Integer, _
                                              ByVal fechaInicio As DateTime, ByVal fechaFin As DateTime) As DataSet
        Try

            Dim vPro As New ClassSigeco.ClassSigeco.si_usuario(conn)
            Dim ds As New DataSet

            ds = vPro.get_estado_cuenta_cliente(conn, idCliente, fechaInicio, fechaFin)

            If Not ds Is Nothing Then

                If ds.Tables.Count = 3 Then

                    Dim saldoAnt As Decimal = 0

                    If ds.Tables(0).Rows.Count > 0 Then

                        For i As Integer = 0 To ds.Tables(0).Rows.Count - 1
                            If i > 0 Then
                                ds.Tables(0).Rows(i)("totalSaldo") = ds.Tables(0).Rows(i - 1)("totalSaldo") + ds.Tables(0).Rows(i)("totalSaldo")
                            End If
                        Next

                        saldoAnt = ds.Tables(0).Rows(ds.Tables(0).Rows.Count - 1)("totalSaldo")

                    End If

                    If ds.Tables(1).Rows.Count > 0 Then

                        For i As Integer = 0 To ds.Tables(1).Rows.Count - 1

                            If i > 0 Then
                                ds.Tables(1).Rows(i)("totalSaldo") = ds.Tables(1).Rows(i - 1)("totalSaldo") + ds.Tables(1).Rows(i)("totalSaldo")
                            Else
                                ds.Tables(1).Rows(i)("totalSaldo") = ds.Tables(1).Rows(i)("totalSaldo") + saldoAnt
                            End If

                        Next

                    End If

                    If ds.Tables(2).Rows.Count > 0 Then

                        For i As Integer = 0 To ds.Tables(2).Rows.Count - 1
                            If i > 0 Then
                                ds.Tables(2).Rows(i)("totalSaldo") = ds.Tables(2).Rows(i - 1)("totalSaldo") + ds.Tables(2).Rows(i)("totalSaldo")
                            Else
                                ds.Tables(2).Rows(i)("totalSaldo") = ds.Tables(2).Rows(i)("totalSaldo") + saldoAnt
                            End If
                        Next

                    End If

                Else

                    If ds.Tables(0).Rows.Count > 0 Then

                        For i As Integer = 0 To ds.Tables(0).Rows.Count - 1
                            If i > 0 Then
                                ds.Tables(0).Rows(i)("totalSaldo") = ds.Tables(0).Rows(i - 1)("totalSaldo") + ds.Tables(0).Rows(i)("totalSaldo")
                            End If
                        Next

                    End If

                    If ds.Tables(1).Rows.Count > 0 Then

                        For i As Integer = 0 To ds.Tables(1).Rows.Count - 1
                            If i > 0 Then
                                ds.Tables(1).Rows(i)("totalSaldo") = ds.Tables(1).Rows(i - 1)("totalSaldo") + ds.Tables(1).Rows(i)("totalSaldo")
                            End If
                        Next

                    End If

                End If

                Return ds

            Else
                Return Nothing
            End If

        Catch ex As Exception
            MessageError = ex
            Return Nothing
        End Try

    End Function

    Public Function get_Proveedores_EstadoCuenta(ByVal conn As String, ByVal idProveedor As Integer, _
                                              ByVal fechaInicio As DateTime, ByVal fechaFin As DateTime) As DataSet
        Try

            Dim vPro As New ClassSigeco.ClassSigeco.si_usuario(conn)
            Dim ds As New DataSet

            ds = vPro.get_estado_cuenta_proveedor(conn, idProveedor, fechaInicio, fechaFin)

            If Not ds Is Nothing Then

                If ds.Tables.Count = 3 Then

                    Dim saldoAnt As Decimal = 0

                    If ds.Tables(0).Rows.Count > 0 Then

                        For i As Integer = 0 To ds.Tables(0).Rows.Count - 1
                            If i > 0 Then
                                ds.Tables(0).Rows(i)("totalSaldo") = ds.Tables(0).Rows(i - 1)("totalSaldo") + ds.Tables(0).Rows(i)("totalSaldo")
                            End If
                        Next

                        saldoAnt = ds.Tables(0).Rows(ds.Tables(0).Rows.Count - 1)("totalSaldo")

                    End If

                    If ds.Tables(1).Rows.Count > 0 Then

                        For i As Integer = 0 To ds.Tables(1).Rows.Count - 1

                            If i > 0 Then
                                ds.Tables(1).Rows(i)("totalSaldo") = ds.Tables(1).Rows(i - 1)("totalSaldo") + ds.Tables(1).Rows(i)("totalSaldo")
                            Else
                                ds.Tables(1).Rows(i)("totalSaldo") = ds.Tables(1).Rows(i)("totalSaldo") + saldoAnt
                            End If

                        Next

                    End If

                    If ds.Tables(2).Rows.Count > 0 Then

                        For i As Integer = 0 To ds.Tables(2).Rows.Count - 1
                            If i > 0 Then
                                ds.Tables(2).Rows(i)("totalSaldo") = ds.Tables(2).Rows(i - 1)("totalSaldo") + ds.Tables(2).Rows(i)("totalSaldo")
                            Else
                                ds.Tables(2).Rows(i)("totalSaldo") = ds.Tables(2).Rows(i)("totalSaldo") + saldoAnt
                            End If
                        Next

                    End If

                Else

                    If ds.Tables(0).Rows.Count > 0 Then

                        For i As Integer = 0 To ds.Tables(0).Rows.Count - 1
                            If i > 0 Then
                                ds.Tables(0).Rows(i)("totalSaldo") = ds.Tables(0).Rows(i - 1)("totalSaldo") + ds.Tables(0).Rows(i)("totalSaldo")
                            End If
                        Next

                    End If

                    If ds.Tables(1).Rows.Count > 0 Then

                        For i As Integer = 0 To ds.Tables(1).Rows.Count - 1
                            If i > 0 Then
                                ds.Tables(1).Rows(i)("totalSaldo") = ds.Tables(1).Rows(i - 1)("totalSaldo") + ds.Tables(1).Rows(i)("totalSaldo")
                            End If
                        Next

                    End If

                End If

                Return ds

            Else
                Return Nothing
            End If

        Catch ex As Exception
            MessageError = ex
            Return Nothing
        End Try

    End Function

#End Region

#Region "NotasCredito"

    Public Function Insert_NotasCredito(ByVal conn As String, ByVal fecha As DateTime, ByVal idCliente As Integer, ByVal actualizadoPor As Integer, ByVal idVenta As String) As Integer

        Dim obj As New ClassSigeco.ClassSigeco.si_notaCredito(conn)
        obj.AddNew()

        obj.NroComprobante = get_Ventas_Documento(conn, "NOTACREDITO", actualizadoPor)
        obj.NroTimbrado = get_Ventas_Timbrado(conn, "NOTACREDITO", actualizadoPor)
        obj.VtoTimbrado = get_Ventas_Timbrado_Vto(conn, "NOTACREDITO", actualizadoPor)
        obj.Fecha = fecha

        If idCliente > 0 Then
            obj.IdCliente = idCliente
        End If

        obj.Estado = "APROBADA"
        obj.ActualizadoPor = actualizadoPor
        obj.ActualizadoFecha = DateTime.Now

        If idVenta > 0 Then
            obj.IdVenta = idVenta
        End If

        obj.Save()

        Return obj.IdNotaCredito

    End Function

    Public Function Insert_NotasCredito(ByVal conn As String, ByVal nroComprobante As String, ByVal nroTimbrado As String, ByVal vtoTimbrado As DateTime, ByVal fecha As DateTime, ByVal idCliente As Integer, ByVal idProveedor As Integer, ByVal estado As String, ByVal actualizadoPor As Integer, ByVal idVenta As String, ByVal idCompra As Integer, ByVal idDevolucion As Integer) As Integer

        Dim tx As TransactionMgr

        tx = TransactionMgr.ThreadTransactionMgr()

        Try
            tx.BeginTransaction()

            Dim obj As New ClassSigeco.ClassSigeco.si_notaCredito(conn)
            obj.AddNew()

            obj.NroComprobante = nroComprobante
            obj.NroTimbrado = nroTimbrado
            obj.VtoTimbrado = vtoTimbrado
            obj.Fecha = fecha

            If idCliente > 0 Then
                obj.IdCliente = idCliente
            End If

            If idProveedor > 0 Then
                obj.IdProveedor = idProveedor
            End If

            obj.Estado = estado
            obj.ActualizadoPor = actualizadoPor
            obj.ActualizadoFecha = DateTime.Now

            If idVenta > 0 Then
                obj.IdVenta = idVenta
            End If

            If idCompra > 0 Then
                obj.IdCompra = idCompra
            End If

            If idDevolucion > 0 Then
                obj.IdNotaRemision = idDevolucion
            End If

            obj.Save()

            tx.CommitTransaction()

            Return obj.IdNotaCredito

        Catch ex As Exception
            tx.RollbackTransaction()

            If ex.Message.Contains("ix_") Then
                MessageError = New Exception("Nro. de nota ya existe, favor verifique.")
            Else
                MessageError = ex
            End If

            Return 0

        End Try

    End Function

    Public Function Update_NotasCredito(ByVal conn As String, ByVal idNotaCredito As Integer, ByVal nroComprobante As String, ByVal nroTimbrado As String, ByVal vtoTimbrado As DateTime, ByVal fecha As DateTime, ByVal idCliente As Integer, ByVal idProveedor As Integer, ByVal estado As String, ByVal actualizadoPor As Integer, ByVal idVenta As String, ByVal idCompra As Integer, ByVal idDevolucion As Integer) As Boolean

        Dim tx As TransactionMgr
        tx = TransactionMgr.ThreadTransactionMgr()

        Try
            tx.BeginTransaction()

            Dim obj As New ClassSigeco.ClassSigeco.si_notaCredito(conn)
            obj.Where.IdNotaCredito.Value = idNotaCredito

            If obj.Query.Load Then

                obj.NroComprobante = nroComprobante
                obj.NroTimbrado = nroTimbrado
                obj.VtoTimbrado = vtoTimbrado
                obj.Fecha = fecha

                If idCliente > 0 Then
                    obj.IdCliente = idCliente
                End If

                If idProveedor > 0 Then
                    obj.IdProveedor = idProveedor
                End If

                obj.Estado = estado
                obj.ActualizadoPor = actualizadoPor
                obj.ActualizadoFecha = DateTime.Now

                If idVenta > 0 Then
                    obj.IdVenta = idVenta
                End If

                If idCompra > 0 Then
                    obj.IdCompra = idCompra
                End If

                If idDevolucion > 0 Then
                    obj.IdNotaRemision = idDevolucion
                End If

            End If

            tx.CommitTransaction()
            Return True

        Catch ex As Exception
            tx.RollbackTransaction()
            MessageError = ex
            Return False
        End Try

    End Function

    Public Function Update_NotasCredito_Estado(ByVal conn As String, ByVal idNotaCredito As Integer, _
                                               ByVal estado As String, ByVal actualizadoPor As Integer, _
                                               ByVal nroComprobante As String) As Boolean

        Dim tx As TransactionMgr
        tx = TransactionMgr.ThreadTransactionMgr()

        Try
            tx.BeginTransaction()

            Dim vNota As New ClassSigeco.ClassSigeco.vw_nota_credito(conn)
            vNota.Where.IdNotaCredito.Value = idNotaCredito

            If vNota.Query.Load Then

                Dim obj As New ClassSigeco.ClassSigeco.si_notaCredito(conn)
                obj.Where.IdNotaCredito.Value = idNotaCredito

                If obj.Query.Load Then

                    If estado = "APROBADA" And nroComprobante.Replace("-", "").Replace("_", "").Trim = "" Then
                        nroComprobante = get_Ventas_Documento(conn, "NOTACREDITO", actualizadoPor)
                    End If

                    obj.NroComprobante = nroComprobante
                    obj.Estado = estado
                    obj.ActualizadoPor = actualizadoPor
                    obj.ActualizadoFecha = DateTime.Now
                    obj.Save()

                    If estado = "ANULADA" Then

                        If Not obj.IsColumnNull("idVenta") Then

                            Dim vVentas As New ClassSigeco.ClassSigeco.si_venta(conn)
                            vVentas.Where.IdVenta.Value = obj.IdVenta
                            If vVentas.Query.Load Then
                                vVentas.TotalFacturaSaldo += vNota.Total
                            End If

                        End If

                        If Not obj.IsColumnNull("idCompra") Then

                            Dim cCompras As New ClassSigeco.ClassSigeco.si_compra(conn)
                            cCompras.Where.IdCompra.Value = obj.IdCompra
                            If cCompras.Query.Load Then
                                cCompras.TotalFacturaSaldo += vNota.Total
                            End If

                        End If

                    End If

                End If

            End If

            tx.CommitTransaction()
            Return True

        Catch ex As Exception
            tx.RollbackTransaction()
            MessageError = ex
            Return False
        End Try

    End Function

    Public Function Delete_NotasCredito(ByVal conn As String, ByVal idNotaCredito As Integer, ByVal actualizadoPor As Integer) As Boolean

        Dim tx As TransactionMgr
        tx = TransactionMgr.ThreadTransactionMgr()

        Try
            tx.BeginTransaction()

            Dim vNota As New ClassSigeco.ClassSigeco.vw_nota_credito(conn)
            vNota.Where.IdNotaCredito.Value = idNotaCredito

            If vNota.Query.Load Then

                Dim obj As New ClassSigeco.ClassSigeco.si_notaCredito(conn)
                obj.Where.IdNotaCredito.Value = idNotaCredito

                If vNota.Query.Load Then

                    If Not obj.IsColumnNull("idVenta") Then

                        Dim vVentas As New ClassSigeco.ClassSigeco.si_venta(conn)
                        vVentas.Where.IdVenta.Value = obj.IdVenta
                        If vVentas.Query.Load Then
                            vVentas.TotalFacturaSaldo += vNota.Total
                        End If

                    End If

                    If Not obj.IsColumnNull("idCompra") Then

                        Dim cCompras As New ClassSigeco.ClassSigeco.si_compra(conn)
                        cCompras.Where.IdCompra.Value = obj.IdCompra
                        If cCompras.Query.Load Then
                            cCompras.TotalFacturaSaldo += vNota.Total
                        End If

                    End If

                End If

            End If

            tx.CommitTransaction()
            Return True

        Catch ex As Exception
            tx.RollbackTransaction()
            MessageError = ex
            Return False
        End Try

    End Function

    Public Function get_NotasCredito_All(ByVal conn As String, ByVal idNotaCredito As Integer, ByVal fechaInicio As DateTime, _
                                   ByVal fechaFin As DateTime, ByVal Cliente As String, ByVal Proveedor As String, _
                                   ByVal nroComprobante As String, ByVal nroVenta As String, ByVal nroCompra As String, _
                                   ByVal estado As String, ByVal tipo As String) As DataTable
        Try

            Dim vNotas As New ClassSigeco.ClassSigeco.vw_nota_credito(conn)

            If idNotaCredito > 0 Then
                vNotas.Where.IdNotaCredito.Value = idNotaCredito
            End If

            If tipo.Contains("VENTA") Then
                vNotas.Where.IdCliente.Value = 0
                vNotas.Where.IdCliente.Operator = WhereParameter.Operand.IsNotNull
            Else
                vNotas.Where.IdProveedor.Value = 0
                vNotas.Where.IdProveedor.Operator = WhereParameter.Operand.IsNotNull
            End If

            If nroComprobante <> "" Then
                vNotas.Where.NroComprobante.Value = "%" & nroComprobante & "%"
                vNotas.Where.NroComprobante.Operator = WhereParameter.Operand.Like
            Else
                vNotas.Where.Fecha.BetweenBeginValue = New DateTime(fechaInicio.Year, fechaInicio.Month, fechaInicio.Day, 0, 0, 0)
                vNotas.Where.Fecha.BetweenEndValue = New DateTime(fechaFin.Year, fechaFin.Month, fechaFin.Day, 23, 59, 59)
                vNotas.Where.Fecha.Operator = WhereParameter.Operand.Between
            End If

            If estado <> "" Then
                vNotas.Where.Estado.Value = estado
            End If

            If Cliente <> "" Then
                vNotas.Where.Cliente.Value = "%" + Cliente + "%"
                vNotas.Where.Cliente.Operator = WhereParameter.Operand.Like
            End If

            If Proveedor <> "" Then
                vNotas.Where.Proveedor.Value = "%" + Proveedor + "%"
                vNotas.Where.Proveedor.Operator = WhereParameter.Operand.Like
            End If

            If nroVenta <> "" Then
                vNotas.Where.NroVenta.Value = "%" + nroVenta + "%"
                vNotas.Where.NroVenta.Operator = WhereParameter.Operand.Like
            End If

            If nroCompra <> "" Then
                vNotas.Where.NroCompra.Value = "%" + nroCompra + "%"
                vNotas.Where.NroCompra.Operator = WhereParameter.Operand.Like
            End If

            vNotas.Query.AddOrderBy("fecha", WhereParameter.Dir.DESC)

            If vNotas.Query.Load Then
                If vNotas.DefaultView.Table.Rows.Count > 0 Then
                    Return vNotas.DefaultView.Table
                Else
                    Return Nothing
                End If

            Else
                Return Nothing

            End If

        Catch ex As Exception
            MessageError = ex
            Return Nothing
        End Try

    End Function

    Public Function get_NotasCredito_by_ID(ByVal conn As String, ByVal idNotaCredito As Integer) As DataTable
        Try

            Dim vNotas As New ClassSigeco.ClassSigeco.vw_nota_credito(conn)

            If idNotaCredito > 0 Then
                vNotas.Where.IdNotaCredito.Value = idNotaCredito
            End If

            vNotas.Query.AddOrderBy("fecha", WhereParameter.Dir.DESC)

            If vNotas.Query.Load Then
                If vNotas.DefaultView.Table.Rows.Count > 0 Then
                    Return vNotas.DefaultView.Table
                Else
                    Return Nothing
                End If

            Else
                Return Nothing

            End If

        Catch ex As Exception
            MessageError = ex
            Return Nothing
        End Try

    End Function

    Public Function Insert_NotasCredito_Detalle(ByVal conn As String, ByVal idNotaCredito As Integer, ByVal cantidad As Decimal, ByVal descripcion As String, ByVal idImpuesto As Integer, ByVal precio_final As Decimal, ByVal codVenta As Integer, ByVal codCompra As Integer) As Boolean

        Dim tx As TransactionMgr
        tx = TransactionMgr.ThreadTransactionMgr()

        Try
            tx.BeginTransaction()

            If codVenta > 0 Then
                Dim venta As New ClassSigeco.ClassSigeco.si_venta(conn)
                venta.Where.IdVenta.Value = codVenta
                'venta.Where.Condicion.Value = "CREDITO"
                If venta.Query.Load Then

                    If venta.Condicion = "CREDITO" Then
                        venta.TotalFacturaSaldo -= precio_final

                        If venta.TotalFacturaSaldo < 0 Then
                            Throw New Exception("El saldo de la factura es inferior al monto de nota de credito.")
                        End If
                    Else
                        venta.TotalFactura -= precio_final

                        If venta.TotalFactura < 0 Then
                            Throw New Exception("El monto del credito es superior al total de la factura.")
                        End If
                    End If

                    

                    venta.Save()

                End If

            End If

            If codCompra > 0 Then
                Dim compra As New ClassSigeco.ClassSigeco.si_compra(conn)
                compra.Where.IdCompra.Value = codCompra
                'compra.Where.Condicion.Value = "CREDITO"
                If compra.Query.Load Then

                    If compra.Condicion = "CREDITO" Then
                        compra.TotalFacturaSaldo -= precio_final

                        If compra.TotalFacturaSaldo < 0 Then
                            Throw New Exception("El saldo de la factura es inferior al monto de nota de credito.")
                        End If
                    Else
                        compra.TotalFactura -= precio_final

                        If compra.TotalFactura < 0 Then
                            Throw New Exception("El monto del credito es superior al total de la factura.")
                        End If
                    End If

                    

                    compra.Save()

                End If
            End If
            

            Dim impuestoMonto As Decimal = 0

            Dim impuesto As New ClassSigeco.ClassSigeco.si_impuesto(conn)
            impuesto.Where.IdImpuesto.Value = idImpuesto

            If impuesto.Query.Load Then

                If impuesto.Valor = 10 Then
                    impuestoMonto = precio_final / 11
                ElseIf impuesto.Valor = 5 Then
                    impuestoMonto = precio_final / 21
                ElseIf impuesto.Valor = 0 Then
                    impuestoMonto = 0
                End If

            End If

            Dim detalle As New ClassSigeco.ClassSigeco.si_notaCredito_detalle(conn)

            detalle.AddNew()
            detalle.IdNotaCredito = idNotaCredito
            detalle.Descripcion = descripcion
            detalle.Cantidad = cantidad
            detalle.Iva = impuestoMonto
            detalle.Precio_final = precio_final
            detalle.Save()

            tx.CommitTransaction()

            Return True

        Catch ex As Exception

            tx.RollbackTransaction()
            'If ex.Message.Contains("ix_mercaderia") Then
            '    MessageError = New Exception("No puede ingresar la misma mercaderia en una misma venta, favor verifique.")
            'Else
            MessageError = ex
            'End If

            Return False

        End Try

    End Function

    Public Function Insert_NotasCredito_Detalle_Devolucion(ByVal conn As String, ByVal idNotaCredito As Integer, ByVal cantidad As Decimal, _
                                                           ByVal descripcion As String, ByVal impuestoMonto As Decimal, ByVal precio_final As Decimal, _
                                                           ByVal codCompra As Integer) As Boolean

        Dim tx As TransactionMgr
        tx = TransactionMgr.ThreadTransactionMgr()

        Try
            tx.BeginTransaction()

            If codCompra > 0 Then
                Dim compra As New ClassSigeco.ClassSigeco.si_compra(conn)
                compra.Where.IdCompra.Value = codCompra
                'compra.Where.Condicion.Value = "CREDITO"
                If compra.Query.Load Then

                    If compra.Condicion = "CREDITO" Then
                        compra.TotalFacturaSaldo -= precio_final

                        If compra.TotalFacturaSaldo < 0 Then
                            Throw New Exception("El saldo de la factura es inferior al monto de nota de credito.")
                        End If
                    Else
                        compra.TotalFactura -= precio_final

                        If compra.TotalFactura < 0 Then
                            Throw New Exception("El monto del credito es superior al total de la factura.")
                        End If
                    End If



                    compra.Save()

                End If
            End If

            Dim detalle As New ClassSigeco.ClassSigeco.si_notaCredito_detalle(conn)

            detalle.AddNew()
            detalle.IdNotaCredito = idNotaCredito
            detalle.Descripcion = descripcion
            detalle.Cantidad = cantidad
            detalle.Iva = impuestoMonto
            detalle.Precio_final = precio_final
            detalle.Save()

            tx.CommitTransaction()

            Return True

        Catch ex As Exception

            tx.RollbackTransaction()
            'If ex.Message.Contains("ix_mercaderia") Then
            '    MessageError = New Exception("No puede ingresar la misma mercaderia en una misma venta, favor verifique.")
            'Else
            MessageError = ex
            'End If

            Return False

        End Try

    End Function

    Public Function Insert_NotasCredito_Detalle_Non(ByVal conn As String, ByVal idNotaCredito As Integer, ByVal cantidad As Decimal, ByVal descripcion As String, ByVal idImpuesto As Integer, ByVal precio_final As Decimal, ByVal codVenta As Integer, ByVal codCompra As Integer) As Boolean

        If codVenta > 0 Then
            Dim venta As New ClassSigeco.ClassSigeco.si_venta(conn)
            venta.Where.IdVenta.Value = codVenta
            venta.Where.Condicion.Value = "CREDITO"
            If venta.Query.Load Then

                venta.TotalFacturaSaldo -= precio_final

                'If venta.TotalFacturaSaldo < 0 Then
                '    Throw New Exception("El saldo de la factura es inferior al monto de nota de credito.")
                'End If

                venta.Save()

            End If
        End If

        If codCompra > 0 Then
            Dim compra As New ClassSigeco.ClassSigeco.si_compra(conn)
            compra.Where.IdCompra.Value = codCompra
            compra.Where.Condicion.Value = "CREDITO"
            If compra.Query.Load Then

                compra.TotalFacturaSaldo -= precio_final

                If compra.TotalFacturaSaldo < 0 Then
                    Throw New Exception("El saldo de la factura es inferior al monto de nota de credito.")
                End If

                compra.Save()

            End If
        End If


        Dim impuestoMonto As Decimal = 0

        Dim impuesto As New ClassSigeco.ClassSigeco.si_impuesto(conn)
        impuesto.Where.IdImpuesto.Value = idImpuesto

        If impuesto.Query.Load Then

            If impuesto.Valor = 10 Then
                impuestoMonto = precio_final / 11
            ElseIf impuesto.Valor = 5 Then
                impuestoMonto = precio_final / 21
            ElseIf impuesto.Valor = 0 Then
                impuestoMonto = 0
            End If

        End If

        Dim detalle As New ClassSigeco.ClassSigeco.si_notaCredito_detalle(conn)

        detalle.AddNew()
        detalle.IdNotaCredito = idNotaCredito
        detalle.Descripcion = descripcion
        detalle.Cantidad = cantidad
        detalle.Iva = impuestoMonto
        detalle.Precio_final = precio_final
        detalle.Save()

        Return True

    End Function

    Public Function Delete_NotasCredito_Detalle(ByVal conn As String, ByVal idNotaCreditoDetalle As Integer, _
                                           ByVal actualizadoPor As Integer, ByVal idNotaCredito As Integer) As Boolean

        Dim tx As TransactionMgr
        tx = TransactionMgr.ThreadTransactionMgr()

        Try
            tx.BeginTransaction()

            Dim detalle As New ClassSigeco.ClassSigeco.si_notaCredito_detalle(conn)
            detalle.Where.IdNotaCreditoDetalle.Value = idNotaCreditoDetalle

            If detalle.Query.Load Then

                detalle.MarkAsDeleted()
                detalle.Save()

            End If

            Dim obj As New ClassSigeco.ClassSigeco.vw_nota_credito(conn)
            obj.Where.IdNotaCredito.Value = idNotaCredito

            If obj.Query.Load Then

                If Not obj.IsColumnNull("idVenta") Then

                    Dim vVentas As New ClassSigeco.ClassSigeco.si_venta(conn)
                    vVentas.Where.IdVenta.Value = obj.IdVenta
                    If vVentas.Query.Load Then
                        vVentas.TotalFacturaSaldo += obj.Total
                    End If

                End If

                If Not obj.IsColumnNull("idCompra") Then

                    Dim cCompras As New ClassSigeco.ClassSigeco.si_compra(conn)
                    cCompras.Where.IdCompra.Value = obj.IdCompra
                    If cCompras.Query.Load Then
                        cCompras.TotalFacturaSaldo += obj.Total
                    End If

                End If

            End If

            tx.CommitTransaction()

            Return True

        Catch ex As Exception
            tx.RollbackTransaction()
            MessageError = ex
            Return False
        End Try

    End Function

    Public Function get_NotasCredito_Detalles_All(ByVal conn As String, ByVal idNotaCredito As Integer) As DataTable
        Try

            Dim vDetalle As New ClassSigeco.ClassSigeco.vw_nota_credito_detalle(conn)

            If idNotaCredito > 0 Then
                vDetalle.Where.IdNotaCredito.Value = idNotaCredito
            End If

            If vDetalle.Query.Load Then
                If vDetalle.DefaultView.Table.Rows.Count > 0 Then
                    Return vDetalle.DefaultView.Table
                Else
                    Return Nothing
                End If

            Else
                Return Nothing

            End If

        Catch ex As Exception
            MessageError = ex
            Return Nothing
        End Try

    End Function

#End Region

#Region "Ventas"

    Public Function get_Caja_Movimientos_All(ByVal conn As String, ByVal fechaInicio As DateTime, _
                                   ByVal fechaFin As DateTime, ByRef saldo_Anterior_param As Decimal) As DataSet
        Try

            Dim vPro As New ClassSigeco.ClassSigeco.si_usuario(conn)

            Dim ds As New DataSet

            ds = vPro.get_caja_movimientos_totales(conn, New DateTime(2000, 1, 1, 0, 0, 0), fechaInicio.AddDays(-1))

            Dim saldoAnt As Decimal = 0

            If Not ds Is Nothing Then

                If ds.Tables(0).Rows.Count > 0 Then

                    ds.Tables(0).TableName = "proc_caja_general_movimientos_totales"

                    For i As Integer = 0 To ds.Tables(0).Rows.Count - 1
                        If i > 0 Then
                            ds.Tables(0).Rows(i)("saldo") = ds.Tables(0).Rows(i - 1)("saldo") + ds.Tables(0).Rows(i)("saldo")
                        End If
                    Next

                    saldoAnt = ds.Tables(0).Rows(ds.Tables(0).Rows.Count - 1)("saldo")

                End If

            End If

            '-----------------------------------------------------

            saldo_Anterior_param = saldoAnt

            Dim dsM As New DataSet

            dsM = vPro.get_caja_movimientos(conn, fechaInicio, fechaFin)

            If Not dsM Is Nothing Then
                If dsM.Tables(0).Rows.Count > 0 Then

                    For i As Integer = 0 To dsM.Tables(0).Rows.Count - 1

                        If i > 0 Then
                            dsM.Tables(0).Rows(i)("Saldo") = dsM.Tables(0).Rows(i - 1)("Saldo") + dsM.Tables(0).Rows(i)("Saldo")
                        Else
                            dsM.Tables(0).Rows(i)("Saldo") = dsM.Tables(0).Rows(i)("Saldo") + saldoAnt
                        End If

                    Next

                    dsM.Tables(0).TableName = "proc_caja_general_movimientos"
                    ds.Tables.Add(dsM.Tables(0).Copy)

                End If

            End If

            '-------------------------------------------------------------
            Dim dsT As New DataSet

            dsT = vPro.get_caja_movimientos_totales(conn, fechaInicio, fechaFin)

            If Not dsT Is Nothing Then
                If dsT.Tables(0).Rows.Count > 0 Then

                    dsT.Tables(0).TableName = "proc_caja_general_movimientos_totales1"

                    For i As Integer = 0 To dsT.Tables(0).Rows.Count - 1

                        If i > 0 Then
                            dsT.Tables(0).Rows(i)("Saldo") = dsT.Tables(0).Rows(i - 1)("Saldo") + dsT.Tables(0).Rows(i)("Saldo")
                        Else
                            dsT.Tables(0).Rows(i)("Saldo") = dsT.Tables(0).Rows(i)("Saldo") + saldoAnt
                        End If

                    Next

                    ds.Tables.Add(dsT.Tables(0).Copy)

                End If

            End If

            Return ds

        Catch ex As Exception
            MessageError = ex
            Return Nothing
        End Try

    End Function

    Public Function Insert_Log(ByVal dbConn As String, ByVal descripcion As String, ByVal codUsuario As Integer, _
                                ByVal actual As Boolean, Optional ByVal dt As DataTable = Nothing) As Integer

        Dim datos As String = ""
        If Not dt Is Nothing Then
            For x As Integer = 0 To dt.Rows.Count - 1
                For i As Integer = 0 To dt.Columns.Count - 1
                    datos += dt.Columns(i).ColumnName & ": " & dt.Rows(x)(i).ToString() & " | " '& Environment.NewLine
                Next
            Next
        End If

        Dim usu As New ClassSigeco.ClassSigeco.sys_log(dbConn)

        usu.AddNew()
        usu.Descripcion = descripcion
        usu.Fecha = DateTime.Now
        usu.RealizadoPor = codUsuario

        If actual Then
            usu.ValorNuevo = datos
            usu.ValorAnterior = ""
        Else
            usu.ValorNuevo = ""
            usu.ValorAnterior = datos
        End If

        usu.Save()

        Return usu.IdLog

    End Function

    Public Function Insert_Ventas(ByVal conn As String, ByVal nroComprobante As String, ByVal fecha As DateTime, _
                                   ByVal idCliente As Integer, ByVal fechaVto As String, _
        ByVal condicion As String, ByVal estado As String, ByVal idNotaPedido As Integer, _
        ByVal idAdministrador As Integer, ByVal total As Decimal, ByVal saldo As Decimal, ByVal totalIva As Decimal, _
        ByVal idUsuario As Integer, ByVal idVendedor As Integer) As Integer

        Dim tx As TransactionMgr

        tx = TransactionMgr.ThreadTransactionMgr()

        Try
            tx.BeginTransaction()

            Dim ventas As New ClassSigeco.ClassSigeco.si_venta(conn)
            ventas.AddNew()

            ventas.NroComprobante = nroComprobante
            ventas.Fecha = fecha
            ventas.IdCliente = idCliente

            If idVendedor > 0 Then
                ventas.IdVendedor = idVendedor
            Else
                ventas.SetColumnNull("IdVendedor")
            End If

            If fechaVto <> "" Then
                ventas.FechaVencimiento = DateTime.Parse(fechaVto)
            End If

            ventas.Condicion = condicion
            ventas.Estado = estado

            If idNotaPedido > 0 Then
                ventas.IdNotaPedido = idNotaPedido
            End If

            If idAdministrador > 0 Then
                ventas.IdAdministrador = idAdministrador
            End If

            ventas.TotalFactura = total
            ventas.TotalFacturaIVA = totalIva

            If condicion = "CONTADO" Then
                ventas.TotalFacturaSaldo = 0
            Else
                ventas.TotalFacturaSaldo = ventas.TotalFactura
            End If

            ventas.ActualizadoPor = idUsuario
            ventas.ActualizadoFecha = DateTime.Now

            ventas.Save()

            Insert_Log(conn, "REGISTRO DE VENTA", idUsuario, True, ventas.DefaultView.Table)

            tx.CommitTransaction()

            Return ventas.IdVenta

        Catch ex As Exception
            tx.RollbackTransaction()
            MessageError = ex
            Return 0
        End Try

    End Function

    Public Function Insert_Ventas(ByVal conn As String, ByVal nroComprobante As String, ByVal fecha As DateTime, _
                                   ByVal idCliente As Integer, ByVal fechaVto As String, _
        ByVal condicion As String, ByVal estado As String, ByVal idNotaPedido As Integer, _
        ByVal idAdministrador As Integer, ByVal total As Decimal, ByVal saldo As Decimal, ByVal totalIva As Decimal, _
        ByVal idUsuario As Integer, ByVal idVendedor As Integer, ByVal idMovimientoCaja As Integer) As Integer

        Dim tx As TransactionMgr

        tx = TransactionMgr.ThreadTransactionMgr()

        Try
            tx.BeginTransaction()

            Dim ventas As New ClassSigeco.ClassSigeco.si_venta(conn)
            ventas.AddNew()

            ventas.NroComprobante = nroComprobante
            ventas.Fecha = fecha
            ventas.IdCliente = idCliente
            ventas.IdCaja = idMovimientoCaja

            If idVendedor > 0 Then
                ventas.IdVendedor = idVendedor
            Else
                ventas.SetColumnNull("IdVendedor")
            End If

            If fechaVto <> "" Then
                ventas.FechaVencimiento = DateTime.Parse(fechaVto)
            End If

            ventas.Condicion = condicion
            ventas.Estado = estado

            If idNotaPedido > 0 Then
                ventas.IdNotaPedido = idNotaPedido
            End If

            If idAdministrador > 0 Then
                ventas.IdAdministrador = idAdministrador
            End If

            ventas.TotalFactura = total
            ventas.TotalFacturaIVA = totalIva

            If condicion = "CONTADO" Then
                ventas.TotalFacturaSaldo = 0
            Else
                ventas.TotalFacturaSaldo = ventas.TotalFactura
            End If

            ventas.ActualizadoPor = idUsuario
            ventas.ActualizadoFecha = DateTime.Now

            ventas.Save()

            Insert_Log(conn, "REGISTRO DE VENTA", idUsuario, True, ventas.DefaultView.Table)

            tx.CommitTransaction()

            Return ventas.IdVenta

        Catch ex As Exception
            tx.RollbackTransaction()
            MessageError = ex
            Return 0
        End Try

    End Function

    Public Function Update_Ventas(ByVal conn As String, ByVal idVenta As Integer, _
                                     ByVal nroComprobante As String, ByVal fecha As DateTime, _
                                   ByVal idCliente As Integer, ByVal fechaVto As String, _
        ByVal condicion As String, ByVal estado As String, ByVal idNotaPedido As Integer, _
        ByVal idAdministrador As Integer, ByVal total As Decimal, ByVal saldo As Decimal, ByVal totalIva As Decimal, _
        ByVal idUsuario As Integer, ByVal idVendedor As Integer) As Boolean

        Dim tx As TransactionMgr
        tx = TransactionMgr.ThreadTransactionMgr()

        Try
            tx.BeginTransaction()

            Dim ventas As New ClassSigeco.ClassSigeco.si_venta(conn)
            ventas.Where.IdVenta.Value = idVenta

            If ventas.Query.Load Then

                Insert_Log(conn, "PRE-ACTUALIZACION DE VENTA", idUsuario, False, ventas.DefaultView.Table)

                ventas.NroComprobante = nroComprobante
                ventas.Fecha = fecha
                ventas.IdCliente = idCliente

                If idVendedor > 0 Then
                    ventas.IdVendedor = idVendedor
                Else
                    ventas.SetColumnNull("IdVendedor")
                End If

                If fechaVto <> "" Then
                    ventas.FechaVencimiento = DateTime.Parse(fechaVto)
                End If

                ventas.Condicion = condicion
                ventas.Estado = estado

                If idNotaPedido > 0 Then
                    ventas.IdNotaPedido = idNotaPedido
                End If

                If idAdministrador > 0 Then
                    ventas.IdAdministrador = idAdministrador
                End If

                ventas.TotalFactura = total
                ventas.TotalFacturaIVA = totalIva

                If condicion = "CONTADO" Then
                    ventas.TotalFacturaSaldo = 0
                Else
                    ventas.TotalFacturaSaldo = ventas.TotalFactura
                End If

                ventas.ActualizadoPor = idUsuario
                ventas.ActualizadoFecha = DateTime.Now

                ventas.Save()

            End If

            tx.CommitTransaction()

            Insert_Log(conn, "ACTUALIZACION DE VENTA", idUsuario, True, ventas.DefaultView.Table)

            Return True

        Catch ex As Exception
            tx.RollbackTransaction()
            MessageError = ex
            Return False
        End Try

    End Function

    Public Function Update_Ventas_Estado(ByVal conn As String, ByVal idVenta As Integer, _
                                         ByVal estadoVenta As String, ByVal codUsuario As Integer, _
                                         ByVal nroFactura As String, ByVal idMotivoRemision As Integer) As Boolean

        Dim tx As TransactionMgr
        tx = TransactionMgr.ThreadTransactionMgr()

        Try
            tx.BeginTransaction()

            Dim compras As New controller_compras()

            Dim Ventas As New ClassSigeco.ClassSigeco.si_venta(conn)
            Ventas.Where.IdVenta.Value = idVenta

            Dim vVentas As New ClassSigeco.ClassSigeco.vw_ventas(conn)
            vVentas.Where.IdVenta.Value = idVenta

            If Ventas.Query.Load Then

                If estadoVenta = "APROBADA" And nroFactura.Replace("-", "").Replace("_", "").Trim = "" Then
                    nroFactura = get_Ventas_Documento(conn, "FACTURA", codUsuario)
                End If

                Ventas.NroComprobante = nroFactura
                Ventas.Estado = estadoVenta
                Ventas.ActualizadoPor = codUsuario
                Ventas.ActualizadoFecha = DateTime.Now
                Ventas.Save()

                If estadoVenta = "ANULADA" Then

                    Dim detalle As New ClassSigeco.ClassSigeco.si_venta_detalle(conn)
                    detalle.Where.IdVenta.Value = idVenta
                    If detalle.Query.Load Then

                        For i As Integer = 0 To detalle.DefaultView.Table.Rows.Count - 1

                            Dim loteMercaderia As New ClassSigeco.ClassSigeco.si_mercaderiaLote(conn)
                            loteMercaderia.Where.IdMercaderiaLote.Value = detalle.DefaultView.Table.Rows(i)("IdMercaderiaLote")
                            If loteMercaderia.Query.Load Then

                                loteMercaderia.Saldo = loteMercaderia.Saldo + detalle.DefaultView.Table.Rows(i)("Cantidad")
                                If loteMercaderia.Saldo > loteMercaderia.Cantidad Then
                                    Throw New Exception("El saldo supera la cantidad original del lote seleccionado.")
                                End If

                                loteMercaderia.Save()

                            End If

                        Next

                    End If

                    If vVentas.Query.Load Then
                        If Not compras.Update_Remisiones_Estado_NonTransacc(conn, vVentas.IdNotaRemision, estadoVenta, codUsuario, vVentas.NroNotaRemision) Then
                            Throw New Exception("Error al anular remision", compras.MessageError)
                        End If
                    End If

                ElseIf estadoVenta = "APROBADA" Then

                    Dim nroRemision As String = compras.get_Remisiones_Documento(conn, "REMISION", codUsuario)

                    Dim idRemision As Integer = compras.Insert_Remision_NonTransacc(conn, nroRemision, Ventas.Fecha, Ventas.IdVenta, 0, idMotivoRemision, "APROBADA", codUsuario, Ventas.IdCliente, 0)

                    If idRemision > 0 Then

                        Dim ventasDetalle As New vw_ventas_detalle(conn)
                        ventasDetalle.Where.IdVenta.Value = Ventas.IdVenta
                        If ventasDetalle.Query.Load Then

                            For i As Integer = 0 To ventasDetalle.DefaultView.Table.Rows.Count - 1

                                If Not compras.Insert_NotasRemision_Detalle_NonTransacc(conn, idRemision, _
                                                                                        ventasDetalle.DefaultView.Table.Rows(i)("idMercaderia"), _
                                                                                        ventasDetalle.DefaultView.Table.Rows(i)("cantidad"), ventasDetalle.DefaultView.Table.Rows(i)("lote"), _
                                                                                        ventasDetalle.DefaultView.Table.Rows(i)("vencimiento_"), ventasDetalle.DefaultView.Table.Rows(i)("idDeposito"), _
                                                                                        idMotivoRemision, ventasDetalle.DefaultView.Table.Rows(i)("idMercaderiaLote")) Then
                                    Throw New Exception("Error al registrar remisiones detalle", compras.MessageError)

                                End If

                            Next

                        End If

                    End If

                End If

            End If

            Insert_Log(conn, "ACTUALIZACION DE VENTA ESTADO", codUsuario, True, Ventas.DefaultView.Table)

            tx.CommitTransaction()
            Return True

        Catch ex As Exception
            tx.RollbackTransaction()
            MessageError = ex
            Return False
        End Try

    End Function

    Public Function Delete_Ventas(ByVal conn As String, ByVal idVenta As Integer, ByVal codUsuario As Integer) As Boolean

        Dim tx As TransactionMgr
        tx = TransactionMgr.ThreadTransactionMgr()

        Try
            tx.BeginTransaction()

            Dim Ventas As New ClassSigeco.ClassSigeco.si_venta(conn)
            Ventas.Where.IdVenta.Value = idVenta

            If Ventas.Query.Load Then

                Dim detalle As New ClassSigeco.ClassSigeco.si_venta_detalle(conn)
                detalle.Where.IdVenta.Value = idVenta
                If detalle.Query.Load Then

                    For i As Integer = 0 To detalle.DefaultView.Table.Rows.Count - 1

                        Dim loteMercaderia As New ClassSigeco.ClassSigeco.si_mercaderiaLote(conn)
                        loteMercaderia.Where.IdMercaderiaLote.Value = detalle.DefaultView.Table.Rows(i)("IdMercaderiaLote")
                        If loteMercaderia.Query.Load Then

                            loteMercaderia.Saldo = loteMercaderia.Saldo + detalle.DefaultView.Table.Rows(i)("Cantidad")
                            If loteMercaderia.Saldo > loteMercaderia.Cantidad Then
                                Throw New Exception("El saldo supera la cantidad original del lote seleccionado.")
                            End If

                            loteMercaderia.Save()

                        End If

                    Next

                End If

                Ventas.MarkAsDeleted()
                Ventas.Save()

            End If

            tx.CommitTransaction()
            Return True

        Catch ex As Exception
            tx.RollbackTransaction()
            MessageError = ex
            Return False
        End Try

    End Function

    Public Function get_Ventas_Devolucion(ByVal conn As String, ByVal codCliente As Integer, _
                                          ByVal nroFactura As String, ByVal fechaInicio As DateTime, ByVal fechaFin As DateTime) As DataTable
        Try

            Dim vCompras As New ClassSigeco.ClassSigeco.vw_ventas_listado_devolucion(conn)

            If codCliente > 0 Then
                vCompras.Where.IdCliente.Value = codCliente
            End If

            If nroFactura <> "" Then
                vCompras.Where.NroComprobante.Value = "%" & nroFactura & "%"
                vCompras.Where.NroComprobante.Operator = WhereParameter.Operand.Like
            Else
                vCompras.Where.Fecha.BetweenBeginValue = New DateTime(fechaInicio.Year, fechaInicio.Month, fechaInicio.Day, 0, 0, 0)
                vCompras.Where.Fecha.BetweenEndValue = New DateTime(fechaFin.Year, fechaFin.Month, fechaFin.Day, 23, 59, 59)
                vCompras.Where.Fecha.Operator = WhereParameter.Operand.Between
            End If

            vCompras.Query.AddOrderBy("fecha", WhereParameter.Dir.DESC)

            If vCompras.Query.Load Then
                If vCompras.DefaultView.Table.Rows.Count > 0 Then
                    Return vCompras.DefaultView.Table
                Else
                    Return Nothing
                End If

            Else
                Return Nothing

            End If

        Catch ex As Exception
            MessageError = ex
            Return Nothing
        End Try

    End Function

    Public Function get_Ventas_Contado_All(ByVal conn As String, ByVal idVenta As Integer, ByVal fechaInicio As DateTime, _
                                   ByVal fechaFin As DateTime, ByVal condicion As String, ByVal cliente As String, _
                                   ByVal estado As String, ByVal nroFactura As String, ByVal ruc As String, _
                                   ByVal codcliente As Integer) As DataTable
        Try

            Dim vVentas As New ClassSigeco.ClassSigeco.vw_ventas(conn)

            vVentas.Where.EsGasto.Value = "NO"
            vVentas.Where.Saldo_cobro.Value = 0
            vVentas.Where.Saldo_cobro.Operator = WhereParameter.Operand.GreaterThan

            If idVenta > 0 Then
                vVentas.Where.IdVenta.Value = idVenta
            End If

            If codcliente > 0 Then
                vVentas.Where.IdCliente.Value = codcliente
            End If

            If nroFactura <> "" Then
                vVentas.Where.NroComprobante.Value = "%" & nroFactura & "%"
                vVentas.Where.NroComprobante.Operator = WhereParameter.Operand.Like
            Else
                vVentas.Where.Fecha.BetweenBeginValue = New DateTime(fechaInicio.Year, fechaInicio.Month, fechaInicio.Day, 0, 0, 0)
                vVentas.Where.Fecha.BetweenEndValue = New DateTime(fechaFin.Year, fechaFin.Month, fechaFin.Day, 23, 59, 59)
                vVentas.Where.Fecha.Operator = WhereParameter.Operand.Between
            End If

            If condicion <> "" Then
                vVentas.Where.Condicion.Value = condicion
            End If

            If estado <> "" Then
                vVentas.Where.Estado.Value = estado
            End If

            If cliente <> "" Then
                vVentas.Where.Cliente.Value = "%" + cliente + "%"
                vVentas.Where.Cliente.Operator = WhereParameter.Operand.Like
            End If

            If ruc <> "" Then
                vVentas.Where.Ruc.Value = "%" + ruc + "%"
                vVentas.Where.Ruc.Operator = WhereParameter.Operand.Like
            End If

            vVentas.Query.AddOrderBy("fecha", WhereParameter.Dir.DESC)

            If vVentas.Query.Load Then
                If vVentas.DefaultView.Table.Rows.Count > 0 Then
                    Return vVentas.DefaultView.Table
                Else
                    Return Nothing
                End If

            Else
                Return Nothing

            End If

        Catch ex As Exception
            MessageError = ex
            Return Nothing
        End Try

    End Function

    Public Function get_Ventas_Anual_All(ByVal conn As String, ByVal fechaInicio As DateTime, ByVal fechaFin As DateTime) As DataTable
        Try

            Dim vVentas As New ClassSigeco.ClassSigeco.vw_rpt_ventas_anhio_mes(conn)

            'vVentas.Where.Fecha.BetweenBeginValue = New DateTime(fechaInicio.Year, fechaInicio.Month, fechaInicio.Day, 0, 0, 0)
            'vVentas.Where.Fecha.BetweenEndValue = New DateTime(fechaFin.Year, fechaFin.Month, fechaFin.Day, 23, 59, 59)
            'vVentas.Where.Fecha.Operator = WhereParameter.Operand.Between

            vVentas.Query.AddOrderBy("anhio", WhereParameter.Dir.ASC)

            If vVentas.Query.Load Then
                If vVentas.DefaultView.Table.Rows.Count > 0 Then
                    Return vVentas.DefaultView.Table
                Else
                    Return Nothing
                End If

            Else
                Return Nothing

            End If

        Catch ex As Exception
            MessageError = ex
            Return Nothing
        End Try

    End Function

    Public Function get_Ventas_Ganancias_All(ByVal conn As String, ByVal fechaInicio As DateTime, ByVal fechaFin As DateTime) As DataTable
        Try

            Dim vVentas As New ClassSigeco.ClassSigeco.vw_rpt_ventas_ganancia_mes(conn)

            vVentas.Where.Fecha.BetweenBeginValue = New DateTime(fechaInicio.Year, fechaInicio.Month, fechaInicio.Day, 0, 0, 0)
            vVentas.Where.Fecha.BetweenEndValue = New DateTime(fechaFin.Year, fechaFin.Month, fechaFin.Day, 23, 59, 59)
            vVentas.Where.Fecha.Operator = WhereParameter.Operand.Between

            vVentas.Query.AddOrderBy("anhio", WhereParameter.Dir.ASC)
            vVentas.Query.AddOrderBy("mes_valor", WhereParameter.Dir.ASC)
            vVentas.Query.AddOrderBy("fecha", WhereParameter.Dir.ASC)

            If vVentas.Query.Load Then
                If vVentas.DefaultView.Table.Rows.Count > 0 Then
                    Return vVentas.DefaultView.Table
                Else
                    Return Nothing
                End If

            Else
                Return Nothing

            End If

        Catch ex As Exception
            MessageError = ex
            Return Nothing
        End Try

    End Function

    Public Function get_Ventas_Ganancias_Anhio(ByVal conn As String, ByVal fechaInicio As DateTime, ByVal fechaFin As DateTime) As DataTable
        Try

            Dim vVentas As New ClassSigeco.ClassSigeco.vw_rpt_ventas_anhio_all(conn)

            'vVentas.Where.Fecha.BetweenBeginValue = New DateTime(fechaInicio.Year, fechaInicio.Month, fechaInicio.Day, 0, 0, 0)
            'vVentas.Where.Fecha.BetweenEndValue = New DateTime(fechaFin.Year, fechaFin.Month, fechaFin.Day, 23, 59, 59)
            'vVentas.Where.Fecha.Operator = WhereParameter.Operand.Between

            vVentas.Where.Anhio.Value = fechaInicio.Year
            vVentas.Where.Anhio.Operator = WhereParameter.Operand.GreaterThanOrEqual

            vVentas.Where.Anhio.Value = fechaFin.Year
            vVentas.Where.Anhio.Operator = WhereParameter.Operand.LessThanOrEqual

            vVentas.Query.AddOrderBy("anhio", WhereParameter.Dir.ASC)
            vVentas.Query.AddOrderBy("mes_valor", WhereParameter.Dir.ASC)
            'vVentas.Query.AddOrderBy("fecha", WhereParameter.Dir.ASC)

            If vVentas.Query.Load Then
                If vVentas.DefaultView.Table.Rows.Count > 0 Then
                    Return vVentas.DefaultView.Table
                Else
                    Return Nothing
                End If

            Else
                Return Nothing

            End If

        Catch ex As Exception
            MessageError = ex
            Return Nothing
        End Try

    End Function

    Public Function get_Ventas_All(ByVal conn As String, ByVal idVenta As Integer, ByVal fechaInicio As DateTime, _
                                   ByVal fechaFin As DateTime, ByVal condicion As String, ByVal cliente As String, _
                                   ByVal estado As String, ByVal nroFactura As String, ByVal ruc As String, _
                                   ByVal codcliente As Integer, _
                                   ByVal conSaldo As Boolean, ByVal conGasto As String) As DataTable
        Try

            Dim vVentas As New ClassSigeco.ClassSigeco.vw_ventas_listado(conn)

            If conGasto = "NO" Then
                vVentas.Where.EsGasto.Value = conGasto
            ElseIf conGasto = "SI" Then
                vVentas.Where.EsGasto.Value = conGasto
            End If

            If idVenta > 0 Then
                vVentas.Where.IdVenta.Value = idVenta
            End If

            If codcliente > 0 Then
                vVentas.Where.IdCliente.Value = codcliente
            End If

            If nroFactura <> "" Then
                vVentas.Where.NroComprobante.Value = "%" & nroFactura & "%"
                vVentas.Where.NroComprobante.Operator = WhereParameter.Operand.Like
            Else
                vVentas.Where.Fecha.BetweenBeginValue = New DateTime(fechaInicio.Year, fechaInicio.Month, fechaInicio.Day, 0, 0, 0)
                vVentas.Where.Fecha.BetweenEndValue = New DateTime(fechaFin.Year, fechaFin.Month, fechaFin.Day, 23, 59, 59)
                vVentas.Where.Fecha.Operator = WhereParameter.Operand.Between
            End If

            If condicion <> "" Then
                vVentas.Where.Condicion.Value = condicion
            End If

            If estado <> "" Then
                vVentas.Where.Estado.Value = estado
            End If

            If cliente <> "" Then
                vVentas.Where.Cliente.Value = "%" + cliente + "%"
                vVentas.Where.Cliente.Operator = WhereParameter.Operand.Like
            End If

            If ruc <> "" Then
                vVentas.Where.Ruc.Value = "%" + ruc + "%"
                vVentas.Where.Ruc.Operator = WhereParameter.Operand.Like
            End If

            If conSaldo Then
                vVentas.Where.TotalFacturaSaldo.Value = 0
                vVentas.Where.TotalFacturaSaldo.Operator = WhereParameter.Operand.GreaterThan
            End If

            vVentas.Query.AddOrderBy("fecha", WhereParameter.Dir.DESC)

            If vVentas.Query.Load Then
                If vVentas.DefaultView.Table.Rows.Count > 0 Then
                    Return vVentas.DefaultView.Table
                Else
                    Return Nothing
                End If

            Else
                Return Nothing

            End If

        Catch ex As Exception
            MessageError = ex
            Return Nothing
        End Try

    End Function

    Public Function get_Ventas_All(ByVal conn As String, ByVal estado As String, ByVal nroFactura As String, _
                                   ByVal codcliente As Integer, ByVal conSaldo As Boolean) As DataTable
        Try

            Dim vVentas As New ClassSigeco.ClassSigeco.vw_ventas(conn)

            If codcliente > 0 Then
                vVentas.Where.IdCliente.Value = codcliente
            End If

            If nroFactura <> "" Then
                vVentas.Where.NroComprobante.Value = nroFactura
            End If

            If estado <> "" Then
                vVentas.Where.Estado.Value = estado
                vVentas.Where.Estado.Operator = WhereParameter.Operand.NotEqual
            End If

            If conSaldo Then
                vVentas.Where.TotalFacturaSaldo.Value = 0
                vVentas.Where.TotalFacturaSaldo.Operator = WhereParameter.Operand.GreaterThan
            End If

            vVentas.Query.AddOrderBy("fecha", WhereParameter.Dir.DESC)

            If vVentas.Query.Load Then
                If vVentas.DefaultView.Table.Rows.Count > 0 Then
                    Return vVentas.DefaultView.Table
                Else
                    Return Nothing
                End If

            Else
                Return Nothing

            End If

        Catch ex As Exception
            MessageError = ex
            Return Nothing
        End Try

    End Function

    Public Function get_Ventas_ByID(ByVal conn As String, ByVal idVenta As Integer) As DataTable
        Try

            Dim vVentas As New ClassSigeco.ClassSigeco.vw_ventas(conn)

            If idVenta > 0 Then
                vVentas.Where.IdVenta.Value = idVenta
            End If

            If vVentas.Query.Load Then
                If vVentas.DefaultView.Table.Rows.Count > 0 Then
                    Return vVentas.DefaultView.Table
                Else
                    Return Nothing
                End If

            Else
                Return Nothing

            End If

        Catch ex As Exception
            MessageError = ex
            Return Nothing
        End Try

    End Function

    Public Function get_Ventas_Vendedor(ByVal conn As String) As DataTable
        Try

            Dim vVentas As New ClassSigeco.ClassSigeco.si_vendedor(conn)

            vVentas.Where.Habilitado.Value = True

            If vVentas.Query.Load Then
                If vVentas.DefaultView.Table.Rows.Count > 0 Then
                    Return vVentas.DefaultView.Table
                Else
                    Return Nothing
                End If

            Else
                Return Nothing

            End If

        Catch ex As Exception
            MessageError = ex
            Return Nothing
        End Try

    End Function

    Public Function get_Ventas_Documento(ByVal conn As String, _
                                         ByVal documento As String, ByVal codUsuario As Integer) As String
        Dim vVentas As New ClassSigeco.ClassSigeco.si_documentos(conn)
        Dim numeroFactura As String = ""

        vVentas.Where.Documento.Value = documento
        vVentas.Where.Habilitado.Value = True
        'vVentas.Where.FechaVto.Value = DateTime.Now
        'vVentas.Where.FechaVto.Operator = WhereParameter.Operand.LessThanOrEqual

        If vVentas.Query.Load Then

            If vVentas.DefaultView.Table.Rows.Count > 0 Then

                numeroFactura = vVentas.DefaultView.Table.Rows(0)("prefijo") & _
                vVentas.DefaultView.Table.Rows(0)("numeroActual").ToString().PadLeft(7, "0")

                vVentas.NumeroActual = vVentas.NumeroActual + 1
                vVentas.ActualizadoPor = codUsuario
                vVentas.ActualizadoFecha = DateTime.Now
                vVentas.Save()

                Return numeroFactura

            Else
                Return ""
            End If

        Else

            Return ""

        End If

    End Function

    Public Function get_Ventas_Timbrado(ByVal conn As String, _
                                         ByVal documento As String, ByVal codUsuario As Integer) As String
        Dim vVentas As New ClassSigeco.ClassSigeco.si_documentos(conn)
        Dim numeroFactura As String = ""

        vVentas.Where.Documento.Value = documento
        vVentas.Where.Habilitado.Value = True
        'vVentas.Where.FechaVto.Value = DateTime.Now
        'vVentas.Where.FechaVto.Operator = WhereParameter.Operand.LessThanOrEqual

        If vVentas.Query.Load Then

            If vVentas.DefaultView.Table.Rows.Count > 0 Then

                numeroFactura = vVentas.DefaultView.Table.Rows(0)("timbrado").ToString()
                Return numeroFactura

            Else

                Return ""

            End If

        Else

            Return ""

        End If

    End Function

    Public Function get_Ventas_Timbrado_Vto(ByVal conn As String, _
                                         ByVal documento As String, ByVal codUsuario As Integer) As DateTime
        Dim vVentas As New ClassSigeco.ClassSigeco.si_documentos(conn)
        Dim numeroFactura As DateTime

        vVentas.Where.Documento.Value = documento
        vVentas.Where.Habilitado.Value = True
        'vVentas.Where.FechaVto.Value = DateTime.Now
        'vVentas.Where.FechaVto.Operator = WhereParameter.Operand.LessThanOrEqual

        If vVentas.Query.Load Then

            If vVentas.DefaultView.Table.Rows.Count > 0 Then

                numeroFactura = DateTime.Parse(vVentas.DefaultView.Table.Rows(0)("fechaVto").ToString())
                Return numeroFactura

            Else

                Return Nothing

            End If

        Else

            Return Nothing

        End If

    End Function

    Public Function Insert_Ventas_Detalle(ByVal conn As String, ByVal idVenta As Integer, _
                                           ByVal idMercaderia As Integer, ByVal cantidad As Decimal, _
                                            ByVal precio As Decimal, ByVal idImpuesto As Integer, _
                                            ByVal precioFinal As Decimal, _
                                            ByVal idUsuario As Integer, _
                                            ByVal idMercaderiaLote As Integer, _
                                            ByVal descripcion As String, _
                                            ByVal idCaja As Integer, ByVal esCajero As Boolean) As Boolean

        Dim tx As TransactionMgr
        tx = TransactionMgr.ThreadTransactionMgr()

        Try
            tx.BeginTransaction()

            Dim loteMercaderia As New ClassSigeco.ClassSigeco.si_mercaderiaLote(conn)
            loteMercaderia.Where.IdMercaderiaLote.Value = idMercaderiaLote
            If loteMercaderia.Query.Load Then

                loteMercaderia.Saldo = loteMercaderia.Saldo - cantidad
                If loteMercaderia.Saldo < 0 Then
                    Throw New Exception("No posee saldo suficiente en el lote seleccionado.")
                End If

                loteMercaderia.Save()

            End If

            Dim impuestoMonto As Decimal = 0

            Dim impuesto As New ClassSigeco.ClassSigeco.si_impuesto(conn)
            impuesto.Where.IdImpuesto.Value = idImpuesto

            If impuesto.Query.Load Then

                If impuesto.Valor = 10 Then
                    impuestoMonto = precioFinal / 11
                ElseIf impuesto.Valor = 5 Then
                    impuestoMonto = precioFinal / 21
                ElseIf impuesto.Valor = 0 Then
                    impuestoMonto = 0
                End If

            End If

            Dim detalle As New ClassSigeco.ClassSigeco.si_venta_detalle(conn)

            detalle.AddNew()
            detalle.IdVenta = idVenta

            If idMercaderia > 0 Then
                detalle.IdMercaderia = idMercaderia
            Else
                detalle.SetColumnNull("IdMercaderia")
            End If

            detalle.DescripcionIngreso = descripcion

            If idMercaderiaLote > 0 Then
                detalle.IdMercaderiaLote = idMercaderiaLote
            Else
                detalle.SetColumnNull("IdMercaderiaLote")
            End If

            detalle.Cantidad = cantidad
            detalle.Precio = precio
            detalle.IdImpuesto = idImpuesto
            detalle.PrecioFinal = precioFinal
            detalle.MontoImpuesto = impuestoMonto
            detalle.Save()

            Dim venta As New ClassSigeco.ClassSigeco.si_venta(conn)
            venta.Where.IdVenta.Value = idVenta
            If venta.Query.Load Then

                venta.TotalFactura += detalle.PrecioFinal
                venta.TotalFacturaIVA += detalle.MontoImpuesto

                If venta.Condicion = "CREDITO" Then
                    venta.TotalFacturaSaldo += detalle.PrecioFinal
                End If

                venta.ActualizadoPor = idUsuario
                venta.ActualizadoFecha = DateTime.Now
                venta.Save()

            End If

            If idCaja > 0 Then
                Dim cajas As New ClassSigeco.ClassSigeco.si_caja(conn)
                cajas.Where.IdMovimientoCaja.Value = idCaja
                If cajas.Query.Load Then
                    cajas.MontoCierre += precioFinal
                    cajas.SaldoEfectivo += precioFinal
                    cajas.Save()
                End If

            ElseIf esCajero Then
                Throw New Exception("No posee caja abierta, favor verifique.")
            End If

            tx.CommitTransaction()

            Return True

        Catch ex As Exception

            tx.RollbackTransaction()
            'If ex.Message.Contains("ix_mercaderia") Then
            '    MessageError = New Exception("No puede ingresar la misma mercaderia en una misma venta, favor verifique.")
            'Else
            MessageError = ex
            'End If

            Return False

        End Try

    End Function

    Public Function Delete_Ventas_Detalle(ByVal conn As String, ByVal idVentaDetalle As Integer, _
                                           ByVal codUsuario As Integer, ByVal idVenta As Integer) As Boolean

        Dim tx As TransactionMgr
        tx = TransactionMgr.ThreadTransactionMgr()

        Try
            tx.BeginTransaction()

            Dim detalle As New ClassSigeco.ClassSigeco.si_venta_detalle(conn)

            detalle.Where.IdVentaDetalle.Value = idVentaDetalle

            If detalle.Query.Load Then

                Dim loteMercaderia As New ClassSigeco.ClassSigeco.si_mercaderiaLote(conn)
                loteMercaderia.Where.IdMercaderiaLote.Value = detalle.IdMercaderiaLote
                If loteMercaderia.Query.Load Then

                    loteMercaderia.Saldo = loteMercaderia.Saldo + detalle.Cantidad
                    If loteMercaderia.Saldo > loteMercaderia.Cantidad Then
                        Throw New Exception("El saldo supera la cantidad original del lote seleccionado.")
                    End If

                    loteMercaderia.Save()

                End If

                Dim venta As New ClassSigeco.ClassSigeco.si_venta(conn)
                venta.Where.IdVenta.Value = idVenta

                If venta.Query.Load Then
                    venta.TotalFactura -= detalle.PrecioFinal
                    venta.TotalFacturaIVA -= detalle.MontoImpuesto

                    If venta.Condicion = "CREDITO" Then
                        venta.TotalFacturaSaldo -= detalle.PrecioFinal
                    Else
                        venta.TotalFacturaSaldo = 0
                    End If

                    venta.ActualizadoPor = codUsuario
                    venta.ActualizadoFecha = DateTime.Now
                    venta.Save()

                End If

                detalle.MarkAsDeleted()
                detalle.Save()

            End If

            tx.CommitTransaction()

            Return True

        Catch ex As Exception
            tx.RollbackTransaction()
            MessageError = ex
            Return False
        End Try

    End Function

    Public Function get_Ventas_Detalles_All(ByVal conn As String, ByVal idVenta As Integer) As DataTable
        Try

            Dim vDetalle As New ClassSigeco.ClassSigeco.vw_ventas_detalle(conn)

            If idVenta > 0 Then
                vDetalle.Where.IdVenta.Value = idVenta
            End If

            If vDetalle.Query.Load Then
                If vDetalle.DefaultView.Table.Rows.Count > 0 Then
                    Return vDetalle.DefaultView.Table
                Else
                    Return Nothing
                End If

            Else
                Return Nothing

            End If

        Catch ex As Exception
            MessageError = ex
            Return Nothing
        End Try

    End Function

    Public Function get_Ventas_Detalles_Devolucion(ByVal conn As String, ByVal idVenta As Integer) As DataTable
        Try

            Dim vDetalle As New ClassSigeco.ClassSigeco.vw_ventas_devoluciones(conn)

            If idVenta > 0 Then
                vDetalle.Where.IdVenta.Value = idVenta
            End If

            vDetalle.Where.Saldo.Value = 0
            vDetalle.Where.Saldo.Operator = WhereParameter.Operand.GreaterThan

            If vDetalle.Query.Load Then
                If vDetalle.DefaultView.Table.Rows.Count > 0 Then
                    Return vDetalle.DefaultView.Table
                Else
                    Return Nothing
                End If

            Else
                Return Nothing

            End If

        Catch ex As Exception
            MessageError = ex
            Return Nothing
        End Try

    End Function

    Public Function get_Ventas_Detalles_Imprimir(ByVal conn As String, ByVal idVenta As Integer) As DataTable
        Try

            Dim vDetalle As New ClassSigeco.ClassSigeco.vw_ventas_detalle_impresion(conn)

            If idVenta > 0 Then
                vDetalle.Where.IdVenta.Value = idVenta
            End If

            If vDetalle.Query.Load Then
                If vDetalle.DefaultView.Table.Rows.Count > 0 Then
                    Return vDetalle.DefaultView.Table
                Else
                    Return Nothing
                End If

            Else
                Return Nothing

            End If

        Catch ex As Exception
            MessageError = ex
            Return Nothing
        End Try

    End Function

    Public Function get_Recibos_Detalles_Imprimir(ByVal conn As String, ByVal idRecibo As Integer) As DataTable
        Try

            Dim vDetalle As New ClassSigeco.ClassSigeco.vw_recibos_impresion(conn)

            If idRecibo > 0 Then
                vDetalle.Where.IdRecibo.Value = idRecibo
            End If

            If vDetalle.Query.Load Then
                If vDetalle.DefaultView.Table.Rows.Count > 0 Then
                    Return vDetalle.DefaultView.Table
                Else
                    Return Nothing
                End If

            Else
                Return Nothing

            End If

        Catch ex As Exception
            MessageError = ex
            Return Nothing
        End Try

    End Function

    Public Function get_Ventas_Detalles_ByID(ByVal conn As String, ByVal idVentaDetalle As Integer) As DataTable
        Try

            Dim vDetalle As New ClassSigeco.ClassSigeco.vw_ventas_detalle(conn)

            vDetalle.Where.IdVentaDetalle.Value = idVentaDetalle

            If vDetalle.Query.Load Then
                If vDetalle.DefaultView.Table.Rows.Count > 0 Then
                    Return vDetalle.DefaultView.Table
                Else
                    Return Nothing
                End If

            Else
                Return Nothing

            End If

        Catch ex As Exception
            MessageError = ex
            Return Nothing
        End Try

    End Function

#End Region

#Region "Recibos"

    Public Function Insert_Recibos(ByVal conn As String, ByVal nroComprobante As String, ByVal fecha As DateTime, _
                                ByVal idCliente As Integer, ByVal concepto As String, _
                                ByVal estado As String, _
                                ByVal idUsuario As Integer) As Integer

        Dim tx As TransactionMgr

        tx = TransactionMgr.ThreadTransactionMgr()

        Try
            tx.BeginTransaction()

            Dim ventas As New ClassSigeco.ClassSigeco.si_recibo(conn)
            ventas.AddNew()

            ventas.NroComprobante = nroComprobante
            ventas.Fecha = fecha
            ventas.IdCliente = idCliente
            ventas.Concepto = concepto
            ventas.Estado = estado
            ventas.ActualizadoPor = idUsuario
            ventas.ActualizadoFecha = DateTime.Now
            ventas.Save()

            tx.CommitTransaction()

            Return ventas.IdRecibo

        Catch ex As Exception
            tx.RollbackTransaction()
            MessageError = ex
            Return 0
        End Try

    End Function

    Public Function Update_Recibos(ByVal conn As String, ByVal idRecibo As Integer, _
                                     ByVal nroComprobante As String, ByVal fecha As DateTime, _
                                ByVal idCliente As Integer, ByVal concepto As String, _
                                ByVal estado As String, _
                                ByVal idUsuario As Integer) As Boolean

        Dim tx As TransactionMgr
        tx = TransactionMgr.ThreadTransactionMgr()

        Try
            tx.BeginTransaction()

            Dim ventas As New ClassSigeco.ClassSigeco.si_recibo(conn)
            ventas.Where.IdRecibo.Value = idRecibo

            If ventas.Query.Load Then

                ventas.NroComprobante = nroComprobante
                ventas.Fecha = fecha
                ventas.IdCliente = idCliente
                ventas.Concepto = concepto
                ventas.Estado = estado
                ventas.ActualizadoPor = idUsuario
                ventas.ActualizadoFecha = DateTime.Now

                ventas.Save()

            End If

            tx.CommitTransaction()
            Return True

        Catch ex As Exception
            tx.RollbackTransaction()
            MessageError = ex
            Return False
        End Try

    End Function

    Public Function Update_Recibos_Estado(ByVal conn As String, ByVal idRecibo As Integer, _
                                     ByVal estado As String, ByVal codUsuario As Integer, _
                                     ByVal nroComprobante As String) As Boolean

        Dim tx As TransactionMgr
        tx = TransactionMgr.ThreadTransactionMgr()

        Try
            tx.BeginTransaction()

            Dim Ventas As New ClassSigeco.ClassSigeco.si_recibo(conn)
            Ventas.Where.IdRecibo.Value = idRecibo

            If Ventas.Query.Load Then

                Ventas.NroComprobante = nroComprobante
                Ventas.Estado = estado
                Ventas.ActualizadoPor = codUsuario
                Ventas.ActualizadoFecha = DateTime.Now
                Ventas.Save()

                If estado = "ANULADO" Then

                    Dim detalle As New ClassSigeco.ClassSigeco.si_recibo_detalle(conn)
                    detalle.Where.IdRecibo.Value = idRecibo
                    If detalle.Query.Load Then

                        For i As Integer = 0 To detalle.DefaultView.Table.Rows.Count - 1

                            Dim loteMercaderia As New ClassSigeco.ClassSigeco.si_venta(conn)
                            loteMercaderia.Where.IdVenta.Value = detalle.DefaultView.Table.Rows(i)("IdVenta")
                            If loteMercaderia.Query.Load Then

                                loteMercaderia.TotalFacturaSaldo = loteMercaderia.TotalFacturaSaldo + detalle.DefaultView.Table.Rows(i)("Monto")
                                loteMercaderia.Save()

                            End If

                        Next

                    End If

                End If

            End If

            tx.CommitTransaction()
            Return True

        Catch ex As Exception
            tx.RollbackTransaction()
            MessageError = ex
            Return False
        End Try

    End Function

    Public Function Delete_Recibos(ByVal conn As String, ByVal idRecibo As Integer, ByVal codUsuario As Integer) As Boolean

        Dim tx As TransactionMgr
        tx = TransactionMgr.ThreadTransactionMgr()

        Try
            tx.BeginTransaction()

            Dim Ventas As New ClassSigeco.ClassSigeco.si_recibo(conn)
            Ventas.Where.IdRecibo.Value = idRecibo

            If Ventas.Query.Load Then

                Dim detalle As New ClassSigeco.ClassSigeco.si_recibo_detalle(conn)
                detalle.Where.IdRecibo.Value = idRecibo
                If detalle.Query.Load Then

                    For i As Integer = 0 To detalle.DefaultView.Table.Rows.Count - 1

                        Dim loteMercaderia As New ClassSigeco.ClassSigeco.si_venta(conn)
                        loteMercaderia.Where.IdVenta.Value = detalle.DefaultView.Table.Rows(i)("IdVenta")
                        If loteMercaderia.Query.Load Then

                            loteMercaderia.TotalFacturaSaldo = loteMercaderia.TotalFacturaSaldo + detalle.DefaultView.Table.Rows(i)("Monto")
                            loteMercaderia.Save()

                        End If

                    Next

                End If

                Ventas.MarkAsDeleted()
                Ventas.Save()

            End If

            tx.CommitTransaction()
            Return True

        Catch ex As Exception
            tx.RollbackTransaction()
            MessageError = ex
            Return False
        End Try

    End Function

    Public Function get_Recibos_All(ByVal conn As String, ByVal idRecibo As Integer, ByVal fechaInicio As DateTime, _
                                   ByVal fechaFin As DateTime, ByVal cliente As String, _
                                   ByVal estado As String, ByVal nroComprobante As String, ByVal ruc As String, _
                                   ByVal codCliente As Integer, ByVal noContado As Boolean) As DataTable
        Try

            Dim vVentas As New ClassSigeco.ClassSigeco.vw_recibo(conn)

            If idRecibo > 0 Then
                vVentas.Where.IdRecibo.Value = idRecibo
            End If

            If codCliente > 0 Then
                vVentas.Where.IdCliente.Value = codCliente
            End If

            If nroComprobante <> "" Then
                vVentas.Where.NroComprobante.Value = "%" & nroComprobante & "%"
                vVentas.Where.NroComprobante.Operator = WhereParameter.Operand.Like
            Else
                vVentas.Where.Fecha.BetweenBeginValue = New DateTime(fechaInicio.Year, fechaInicio.Month, fechaInicio.Day, 0, 0, 0)
                vVentas.Where.Fecha.BetweenEndValue = New DateTime(fechaFin.Year, fechaFin.Month, fechaFin.Day, 23, 59, 59)
                vVentas.Where.Fecha.Operator = WhereParameter.Operand.Between
            End If

            If estado <> "" Then
                vVentas.Where.Estado.Value = estado
            End If

            If cliente <> "" Then
                vVentas.Where.Cliente.Value = "%" + cliente + "%"
                vVentas.Where.Cliente.Operator = WhereParameter.Operand.Like
            End If

            If noContado Then
                vVentas.Where.Concepto.Value = "%@CONTADO@%"
                vVentas.Where.Concepto.Operator = WhereParameter.Operand.NotLike
            End If

            'If ruc <> "" Then
            '    vVentas.Where.Ruc.Value = "%" + ruc + "%"
            '    vVentas.Where.Ruc.Operator = WhereParameter.Operand.Like
            'End If

            vVentas.Query.AddOrderBy("fecha", WhereParameter.Dir.DESC)

            If vVentas.Query.Load Then
                If vVentas.DefaultView.Table.Rows.Count > 0 Then
                    Return vVentas.DefaultView.Table
                Else
                    Return Nothing
                End If

            Else
                Return Nothing

            End If

        Catch ex As Exception
            MessageError = ex
            Return Nothing
        End Try

    End Function

    Public Function get_Recibos_ByID(ByVal conn As String, ByVal idRecibo As Integer) As DataTable
        Try

            Dim vVentas As New ClassSigeco.ClassSigeco.vw_recibo(conn)

            If idRecibo > 0 Then
                vVentas.Where.IdRecibo.Value = idRecibo
            End If

            If vVentas.Query.Load Then
                If vVentas.DefaultView.Table.Rows.Count > 0 Then
                    Return vVentas.DefaultView.Table
                Else
                    Return Nothing
                End If

            Else
                Return Nothing

            End If

        Catch ex As Exception
            MessageError = ex
            Return Nothing
        End Try

    End Function

    Public Function get_Recibos_Documento(ByVal conn As String, _
                                         ByVal documento As String, ByVal codUsuario As Integer) As String
        Try

            Dim vVentas As New ClassSigeco.ClassSigeco.si_documentos(conn)
            Dim numeroFactura As String = ""

            vVentas.Where.Documento.Value = documento
            vVentas.Where.Habilitado.Value = True
            'vVentas.Where.FechaVto.Value = DateTime.Now
            'vVentas.Where.FechaVto.Operator = WhereParameter.Operand.LessThanOrEqual

            If vVentas.Query.Load Then

                If vVentas.DefaultView.Table.Rows.Count > 0 Then

                    numeroFactura = vVentas.DefaultView.Table.Rows(0)("prefijo") & _
                    vVentas.DefaultView.Table.Rows(0)("numeroActual").ToString().PadLeft(7, "0")

                    vVentas.NumeroActual = vVentas.NumeroActual + 1
                    vVentas.ActualizadoPor = codUsuario
                    vVentas.ActualizadoFecha = DateTime.Now
                    vVentas.Save()

                    Return numeroFactura

                Else
                    Return ""
                End If

            Else

                Return ""

            End If

        Catch ex As Exception
            MessageError = ex
            Return ""
        End Try

    End Function

    Public Function Insert_Recibo_Detalle(ByVal conn As String, ByVal idRecibo As Integer, _
                                           ByVal idVenta As Integer, ByVal monto As Decimal, _
                                           ByVal obs As String, ByVal formaPago As String, _
                                            ByVal idUsuario As Integer, ByVal idCaja As Integer, _
                                            ByVal esCajero As Boolean, ByVal idBanco As Integer, _
                                           ByVal nroCheque As String, ByVal titular As String, _
                                           ByVal fechaDiferido As String) As Boolean

        Dim tx As TransactionMgr
        tx = TransactionMgr.ThreadTransactionMgr()

        Try
            tx.BeginTransaction()

            Dim loteMercaderia As New ClassSigeco.ClassSigeco.si_venta(conn)
            loteMercaderia.Where.IdVenta.Value = idVenta
            If loteMercaderia.Query.Load Then

                If loteMercaderia.Condicion = "CREDITO" Then
                    loteMercaderia.TotalFacturaSaldo = loteMercaderia.TotalFacturaSaldo - monto
                    If loteMercaderia.TotalFacturaSaldo < 0 Then
                        Throw New Exception("El monto pagado supera el monto de la deuda.")
                    End If

                    loteMercaderia.Save()
                End If

            End If

            Dim cabecera As New ClassSigeco.ClassSigeco.si_recibo(conn)
            cabecera.Where.IdRecibo.Value = idRecibo
            If cabecera.Query.Load Then
                cabecera.ActualizadoPor = idUsuario
                cabecera.ActualizadoFecha = DateTime.Now
                cabecera.Save()
            End If

            Dim detalle As New ClassSigeco.ClassSigeco.si_recibo_detalle(conn)

            detalle.AddNew()
            detalle.IdRecibo = idRecibo
            detalle.IdVenta = idVenta
            detalle.Observaciones = obs
            detalle.FormaPago = formaPago
            detalle.Monto = monto
            detalle.IdCaja = idCaja
            detalle.FechaCaja = DateTime.Now

            If idBanco > 0 Then
                detalle.IdBanco = idBanco
                detalle.Titular = titular
                detalle.NroCheque = nroCheque
                If fechaDiferido <> "" Then
                    detalle.FechaChequeDiferido = DateTime.Parse(fechaDiferido)
                End If
            End If

            detalle.Save()

            If idCaja > 0 Then

                Dim cajas As New ClassSigeco.ClassSigeco.si_caja(conn)
                cajas.Where.IdMovimientoCaja.Value = idCaja
                If cajas.Query.Load Then
                    cajas.MontoCierre += monto

                    If Not formaPago.Contains("TARJETA") And Not formaPago.Contains("CHEQUE") Then
                        cajas.SaldoEfectivo += monto
                    End If

                    cajas.Save()
                End If

            ElseIf esCajero Then
                Throw New Exception("No posee caja abierta, favor verifique.")
            End If

            tx.CommitTransaction()

            Return True

        Catch ex As Exception

            tx.RollbackTransaction()
            'If ex.Message.Contains("ix_mercaderia") Then
            '    MessageError = New Exception("No puede ingresar la misma mercaderia en una misma venta, favor verifique.")
            'Else
            MessageError = ex
            'End If

            Return False

        End Try

    End Function

    Public Function Delete_Recibo_Detalle(ByVal conn As String, ByVal idReciboDetalle As Integer, _
                                           ByVal codUsuario As Integer, ByVal idRecibo As Integer) As Boolean

        Dim tx As TransactionMgr
        tx = TransactionMgr.ThreadTransactionMgr()

        Try
            tx.BeginTransaction()

            Dim detalle As New ClassSigeco.ClassSigeco.si_recibo_detalle(conn)

            detalle.Where.IdReciboDetalle.Value = idReciboDetalle

            If detalle.Query.Load Then

                Dim loteMercaderia As New ClassSigeco.ClassSigeco.si_venta(conn)
                loteMercaderia.Where.IdVenta.Value = detalle.IdVenta
                If loteMercaderia.Query.Load Then

                    If loteMercaderia.Condicion = "CREDITO" Then
                        loteMercaderia.TotalFacturaSaldo = loteMercaderia.TotalFacturaSaldo + detalle.Monto
                        loteMercaderia.Save()
                    End If

                End If

                detalle.MarkAsDeleted()
                detalle.Save()

            End If

            tx.CommitTransaction()

            Return True

        Catch ex As Exception
            tx.RollbackTransaction()
            MessageError = ex
            Return False
        End Try

    End Function

    Public Function get_Recibos_Detalles_All(ByVal conn As String, ByVal idRecibo As Integer) As DataTable
        Try

            Dim vDetalle As New ClassSigeco.ClassSigeco.vw_recibo_detalle(conn)

            If idRecibo > 0 Then
                vDetalle.Where.IdRecibo.Value = idRecibo
            End If

            If vDetalle.Query.Load Then
                If vDetalle.DefaultView.Table.Rows.Count > 0 Then
                    Return vDetalle.DefaultView.Table
                Else
                    Return Nothing
                End If

            Else
                Return Nothing

            End If

        Catch ex As Exception
            MessageError = ex
            Return Nothing
        End Try

    End Function

    Public Function get_Recibos_Cobro_All(ByVal conn As String, ByVal idFactura As Integer) As DataTable
        Try

            Dim vDetalle As New ClassSigeco.ClassSigeco.vw_recibo_detalle(conn)

            If idFactura > 0 Then
                vDetalle.Where.IdVenta.Value = idFactura
            End If

            If vDetalle.Query.Load Then
                If vDetalle.DefaultView.Table.Rows.Count > 0 Then
                    Return vDetalle.DefaultView.Table
                Else
                    Return Nothing
                End If

            Else
                Return Nothing

            End If

        Catch ex As Exception
            MessageError = ex
            Return Nothing
        End Try

    End Function

    Public Function get_Recibos_Detalles_ByID(ByVal conn As String, ByVal idReciboDetalle As Integer) As DataTable
        Try

            Dim vDetalle As New ClassSigeco.ClassSigeco.vw_recibo_detalle(conn)

            vDetalle.Where.IdReciboDetalle.Value = idReciboDetalle

            If vDetalle.Query.Load Then
                If vDetalle.DefaultView.Table.Rows.Count > 0 Then
                    Return vDetalle.DefaultView.Table
                Else
                    Return Nothing
                End If

            Else
                Return Nothing

            End If

        Catch ex As Exception
            MessageError = ex
            Return Nothing
        End Try

    End Function

#End Region



End Class
